package org.smart4j.framework.proxy;

import java.lang.reflect.Method;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * description: 切面代理
 * @version v1.0
 * @author w
 * @date 2018年9月26日下午9:26:50
 */
public abstract class AspectProxy implements Proxy {
	
	private static final Logger logger = LoggerFactory.getLogger(AspectProxy.class);
	
	@Override
	public  Object doProxy(ProxyChain proxyChain) throws Throwable {
		Object result = null ;
		Class<?> targetClass = proxyChain.getTargetClass();
		Method targetMethod = proxyChain.getTargetMethod();
		Object[] methodParams = proxyChain.getMethodParams();
		begin();
		try {
			if(intercept(targetClass,targetMethod,methodParams)){
				before(targetClass,targetMethod,methodParams);
				result = proxyChain.doProxyChain();
				after(targetClass,targetMethod,methodParams,result);
			}else{
				result = proxyChain.doProxyChain();
			}
		} catch (Exception e) {
			logger.error("proxy failure", e);
			error(targetClass,targetMethod,methodParams,e);
			throw e;
		}finally{
			end();
		}
		return result;
	}
	
	/**
	 * description: 准备开始执行增强
	 * @version v1.0
	 * @author w
	 * @date 2018年9月26日 下午9:46:23
	 */
	protected void begin() {
		
	}
	
	/**
	 * description: 拦截 --- 需要执行增强的方法
	 * @param targetClass
	 * @param targetMethod
	 * @param methodParams
	 * @return boolean
	 * @version v1.0
	 * @author w
	 * @date 2018年10月21日 上午11:59:21
	 */
	protected boolean intercept(Class<?> targetClass, Method targetMethod, Object[] methodParams) {
	
		return true;
	}
	
	/**
	 * description: 执行目标方法前的操作 --- 前置增强
	 * @param targetClass
	 * @param targetMethod
	 * @param methodParams
	 * @return void
	 * @version v1.0
	 * @author w
	 * @date 2018年10月21日 上午11:59:58
	 */
	protected void before(Class<?> targetClass, Method targetMethod, Object[] methodParams) {
		
	}
	
	/**
	 * description: 目标方法执行完毕后的操作--- 后置增强
	 * @param targetClass
	 * @param targetMethod
	 * @param methodParams
	 * @param result
	 * @return void
	 * @version v1.0
	 * @author w
	 * @date 2018年10月21日 下午12:01:05
	 */
	protected void after(Class<?> targetClass, Method targetMethod, Object[] methodParams, Object result) {
		
	}
	
	/**
	 * description: 执行代理过程中遇到的异常错误处理
	 * @param targetClass
	 * @param targetMethod
	 * @param methodParams
	 * @param e
	 * @return void
	 * @version v1.0
	 * @author w
	 * @date 2018年10月21日 下午12:02:46
	 */
	protected void error(Class<?> targetClass, Method targetMethod, Object[] methodParams, Exception e) {
		
	}
	
	/**
	 * description: 代理执行完毕后的操作
	 * @return void
	 * @version v1.0
	 * @author w
	 * @date 2018年10月21日 下午12:03:23
	 */
	protected void end() {
		
	}
	
	

}
